package com.handpay.framework.swiper;

import java.util.Hashtable;

public interface IPersonalSwiper {
    String PIN_INDEX = "14";
    enum SwipeStatus {
        SWIPE_OK,
        SWIPE_ERROR,
        SWIPE_CANCEL,
        SWIPE_TIMEOUT
    }
    enum SwiperType {
    	VOICE, BLUETOOTH
    }
	class SwipeResult
	{
		public SwipeStatus	mStatus;
		public String		mData;
        public boolean      mNeedInputPwd;
        //这个是用于判断降级交易的。只用磁条的时候，这个才有用，但磁条也可能没返回这个
        public String       mCardType;

        public SwipeResult(SwipeStatus status, String cardNo, boolean needInputPwd)
        {
            mStatus = status;
            mData = cardNo;
            mNeedInputPwd = needInputPwd;
        }

		public SwipeResult(SwipeStatus status, String cardNo)
		{
			mStatus = status;
			mData = cardNo;
            mNeedInputPwd = true;
		}
		
		public SwipeResult(SwipeStatus status)
		{
			mStatus = status;
			mData = null;
            mNeedInputPwd = true;
		}

        @Override
        public String toString() {
            return super.toString();
        }
    }

//    public static final String KeyDataIndex = "13";
//    public static final String MacDataIndex = "15";
    /**
     * 获取刷卡器ksn
     * @return
     */
    String getCSN();
    /**
     * 停止刷卡器当前操作. 
     * @return true:成功停止当前操作
     */
    boolean stopOperation();
    /**
     *  关闭刷卡器.
     * @return true:成功关闭刷卡器
     */
    boolean closeDevice();
    /**
     * 请求刷卡
     * @param factor 刷卡过程因子
     * @param timeout 超时
     * @return 刷卡状态
     */
    SwipeResult swipeCard(String factor, final int timeout);
    /**
     * 使用刷卡器加密数据
     * @param data    需要加密的数据
     * @param index 指定加密方式
     * @param factor 加密过程因子
     * @return 加密的结果。为null表示加密失败
     */
    String encData(String data, String index, String factor);
    /**
     * 使用刷卡器批量加密数据
     * @param htDatas 加密方式和加密数据组成的hashtable
     * @param factor 加密过程因子
     * @return 加密结果。key是明文, value是密文。value为null表示加密失败
     */
    Hashtable<String, String> batchEncData(Hashtable<Integer, String> htDatas, String factor);
    /** 
     * 选择密钥
     * @param flag
     */
    boolean setMode(SwiperMode flag);
    /**
     * 返回账户相关信息
     * @return
     */
    Hashtable<String, String> getBankInfo();
    /**
     * 判断刷卡器是否可用
     * @return true表示可以使用
     */
    boolean isSwiperReady();
    
    /**
     * 获取刷卡器的使用的型号
     * @return
     */
    SwiperModel getSwiperModel();
}
